#ifndef __WIZ_GEOMETRY_GEOMETRY_ORTHONORMALBASIS_HPP__SHANHAOBO_19800429__
#define __WIZ_GEOMETRY_GEOMETRY_ORTHONORMALBASIS_HPP__SHANHAOBO_19800429__

#include "../../WizAlgebra/Include/Linear/Vector3/WizAlgebraVector3.hpp"

namespace Wiz
{
    namespace OrthonormalBasis
    {
        template<class ElementT>
        struct WIZ_EXPORT Type
        {
            typedef ElementT                                tElement;
            typedef ::Wiz::Vector3::Type<tElement>          tAxis;
            typedef const tAxis&                            tAxisIn;
            typedef tAxis&                                  tAxisOut;

        public:
            Type() : m_XAxis(1, 0, 0), m_YAxis(0, 1, 0), m_ZAxis(0, 0, 1)
            {
            }
            Type(tAxisIn XAxis, tAxisIn YAxis, tAxisIn ZAxis)
            {
                this->Build(XAxis, YAxis, ZAxis);
            }
        public:
            ::Wiz::Void::Type Build(tAxisIn XAxis, tAxisIn YAxis, tAxisIn ZAxis);
        public:
            ::Wiz::Void::Type GetAxises(tAxisOut XAxis, tAxisOut YAxis, tAxisOut ZAxis)
            {
                XAxis = this->m_XAxis;
                YAxis = this->m_YAxis;
                ZAxis = this->m_ZAxis;
            }
            ::Wiz::Void::Type GetXAxis(tAxisOut XAxis)
            {
                XAxis = this->m_XAxis;
            }
            ::Wiz::Void::Type GetYAxis(tAxisOut YAxis)
            {
                YAxis = this->m_YAxis;
            }
            ::Wiz::Void::Type GetZAxis(tAxisOut ZAxis)
            {
                ZAxis = this->m_ZAxis;
            }
        protected:
            tAxis   m_XAxis;
            tAxis   m_YAxis;
            tAxis   m_ZAxis;
        };
    } /// end of OrthonormalBasis
} /// end of namespace Wiz

#endif /*__WIZ_GEOMETRY_GEOMETRY_ORTHONORMALBASIS_HPP__SHANHAOBO_19800429__*/
